#ifndef FIELDPLAYERSTATES_H
#define FIELDPLAYERSTATES_H

#include "State.h"
#include "Singleton.h"

class FieldPlayer;

class GlobalPlayerState : public State<FieldPlayer>, public Singleton<GlobalPlayerState>
{
public:
	void Enter(FieldPlayer*);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class Idle : public State<FieldPlayer>, public Singleton<Idle>
{
	void Enter(FieldPlayer* player);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class ReceivePassage : public State<FieldPlayer>, public Singleton<ReceivePassage>
{
	void Enter(FieldPlayer*);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class HoldBall : public State<FieldPlayer>, public Singleton<HoldBall>
{
	void Enter(FieldPlayer*);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class CatchBall : public State<FieldPlayer>, public Singleton<CatchBall>
{
	void Enter(FieldPlayer*);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class Tackle : public State<FieldPlayer>, public Singleton<Tackle>
{
	void Enter(FieldPlayer*);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class BackToHome : public State<FieldPlayer>, public Singleton<BackToHome>
{
	void Enter(FieldPlayer*);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class FreeFromMarking : public State<FieldPlayer>, public Singleton<FreeFromMarking>
{
	void Enter(FieldPlayer* player);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

class UserControlled : public State<FieldPlayer>, public Singleton<UserControlled>
{
	void Enter(FieldPlayer* player);
	void Execute(FieldPlayer*);
	void Exit(FieldPlayer*);
	bool OnMessage(FieldPlayer* , const Telegram&);
};

#endif
